/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejbs;

import dtos.ProdutoCatalogoDTO;
import dtos.ProdutoDTO;
import entities.Farmacia;
import entities.Produto;
import entities.ProdutoCatalogo;
import excecoes.EntidadeNaoExistenteException;
import exceptions.EntidadeExistenteException;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Diogo
 */
@Stateless
public class ProdutoCatalogoBean implements Serializable {

    @PersistenceContext(name = "Gestao_FarmaciasPU")
    private EntityManager em;
    @EJB
    FarmaciaBean farmaciaBean;
    @EJB
    private ProdutoBean ProdutoBean;

    public void criarProdutoCatalogo(String referencia, String produto, int limiteCritico, String farmacia)
            throws EntidadeExistenteException, EntidadeNaoExistenteException {
        try {
            if (!ProdutoBean.existeProduto(produto)) {
                throw new EntidadeNaoExistenteException("Farmacia nao existe");
            }
            Farmacia f = em.find(Farmacia.class, farmacia);
            if (f == null) {
                throw new EntidadeNaoExistenteException("Farmacia nao existe");
            }
            ProdutoCatalogo pc = new ProdutoCatalogo(referencia, em.find(Produto.class, produto), 0, limiteCritico, em.find(Farmacia.class, farmacia));
            f.getCatalogo().add(pc);
            em.persist(pc);

        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }

    public void atualizaProdutoCatalogo(Long id, String referencia, String produto, int limiteCritico, String farmacia)
            throws EntidadeExistenteException, EntidadeNaoExistenteException {
        try {
            if (!ProdutoBean.existeProduto(produto)) {
                throw new EntidadeNaoExistenteException("Farmacia nao existe");
            }
            if (!farmaciaBean.existeFarmacia(farmacia)) {
                throw new EntidadeNaoExistenteException("Farmacia nao existe");
            }
            ProdutoCatalogo p = em.find(ProdutoCatalogo.class, id);
            p.setReferencia(referencia);
            p.setProduto(em.find(Produto.class, produto));
            p.setLimiteCritico(limiteCritico);
            p.setFarmacia(em.find(Farmacia.class, farmacia));

        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }

    public ProdutoCatalogoDTO getProdutoCatalogo(long id) {
        ProdutoCatalogo p = em.find(ProdutoCatalogo.class, id);
        return new ProdutoCatalogoDTO(p.getId(), p.getReferencia(), p.getProduto().getNome(),
                p.getQuantidade(), p.getLimiteCritico(), p.getFarmacia().getNome());
    }
    
    public ProdutoCatalogo getProdutoCatalogoNaoDTO(long id){
        return em.find(ProdutoCatalogo.class, id);
    }

    public List<ProdutoCatalogoDTO> getAllProdutoCatalogos(String farmacia) {
        try {
            List<ProdutoCatalogo> produtoCatalogos = (List<ProdutoCatalogo>) em.createNamedQuery("findAllProdutoCatalogos")
                    .setParameter("nome", farmacia).getResultList();
            return copiarProdutosParaDTO(produtoCatalogos);
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }

    public List<ProdutoCatalogoDTO> copiarProdutosParaDTO(List<ProdutoCatalogo> produtoCatalogos) {
        List<ProdutoCatalogoDTO> dtos = new LinkedList<>();

        for (ProdutoCatalogo p : produtoCatalogos) {
            dtos.add(new ProdutoCatalogoDTO(p.getId(), p.getReferencia(), p.getProduto().getNome(),
                    p.getQuantidade(), p.getLimiteCritico(), p.getFarmacia().getNome()));
        }
        return dtos;
    }

}
